#ifndef CLINK_ROUTER_STANDARDROUTEHANDLER_H
#define CLINK_ROUTER_STANDARDROUTEHANDLER_H

#include "BaseRouteHandler.h"
#include <functional>

namespace CLink
{
namespace Router
{

/**
 * @brief 标准路由处理器
 *
 * 用于处理标准的HTTP请求，支持基本的路由参数和查询参数。
 */
class CLINK_CLASS StandardRouteHandler : public BaseRouteHandler
{
public:
    /**
     * @brief 路由处理函数类型
     */
    using HandlerFunction = std::function<void(RequestContext &)>;

    /**
     * @brief 构造函数
     * @param path 路由路径
     * @param method HTTP方法
     * @param handler 处理函数
     * @param priority 优先级
     */
    StandardRouteHandler(const std::string &path,
                            const std::string &method,
                            HandlerFunction handler,
                            int priority = 0);

    /**
     * @brief 处理HTTP请求
     * @param context 请求上下文对象
     * @return 如果请求被处理返回true，否则返回false
     */
    bool handle(RequestContext &context) override;

    /**
     * @brief 设置处理函数
     * @param handler 处理函数
     * @return 当前对象的引用，支持链式调用
     */
    StandardRouteHandler &setHandler(HandlerFunction handler);

private:
    HandlerFunction m_handler;             ///< 路由处理函数
};

/**
 * @brief 创建GET路由处理器的辅助函数
 * @param path 路由路径
 * @param handler 处理函数
 * @param priority 优先级
 * @return 路由处理器的智能指针
 */
CLINK_FUNCTION inline std::shared_ptr<StandardRouteHandler> Get(
    const std::string &path,
    StandardRouteHandler::HandlerFunction handler,
    const std::vector<RouteParam>& allow = {},
    int priority = 0)
{
    auto handle = std::make_shared<StandardRouteHandler>(path, "GET", handler, priority);
    handle->addQueryParam(allow);
    return handle;
}

/**
 * @brief 创建POST路由处理器的辅助函数
 * @param path 路由路径
 * @param handler 处理函数
 * @param priority 优先级
 * @return 路由处理器的智能指针
 */
CLINK_FUNCTION inline std::shared_ptr<StandardRouteHandler> Post(
    const std::string &path,
    StandardRouteHandler::HandlerFunction handler,
    int priority = 0)
{
    return std::make_shared<StandardRouteHandler>(path, "POST", handler, priority);
}

/**
 * @brief 创建PUT路由处理器的辅助函数
 * @param path 路由路径
 * @param handler 处理函数
 * @param priority 优先级
 * @return 路由处理器的智能指针
 */
CLINK_FUNCTION inline std::shared_ptr<StandardRouteHandler> Put(
    const std::string &path,
    StandardRouteHandler::HandlerFunction handler,
    int priority = 0)
{
    return std::make_shared<StandardRouteHandler>(path, "PUT", handler, priority);
}

/**
 * @brief 创建DELETE路由处理器的辅助函数
 * @param path 路由路径
 * @param handler 处理函数
 * @param priority 优先级
 * @return 路由处理器的智能指针
 */
CLINK_FUNCTION inline std::shared_ptr<StandardRouteHandler> Delete(
    const std::string &path,
    StandardRouteHandler::HandlerFunction handler,
    int priority = 0)
{
    return std::make_shared<StandardRouteHandler>(path, "DELETE", handler, priority);
}

/**
 * @brief 创建PATCH路由处理器的辅助函数
 * @param path 路由路径
 * @param handler 处理函数
 * @param priority 优先级
 * @return 路由处理器的智能指针
 */
CLINK_FUNCTION inline std::shared_ptr<StandardRouteHandler> Patch(
    const std::string &path,
    StandardRouteHandler::HandlerFunction handler,
    int priority = 0)
{
    return std::make_shared<StandardRouteHandler>(path, "PATCH", handler, priority);
}

/**
 * @brief 创建HEAD路由处理器的辅助函数
 * @param path 路由路径
 * @param handler 处理函数
 * @param priority 优先级
 * @return 路由处理器的智能指针
 */
CLINK_FUNCTION inline std::shared_ptr<StandardRouteHandler> Head(
    const std::string &path,
    StandardRouteHandler::HandlerFunction handler,
    int priority = 0)
{
    return std::make_shared<StandardRouteHandler>(path, "HEAD", handler, priority);
}

/**
 * @brief 创建OPTIONS路由处理器的辅助函数
 * @param path 路由路径
 * @param handler 处理函数
 * @param priority 优先级
 * @return 路由处理器的智能指针
 */
CLINK_FUNCTION inline std::shared_ptr<StandardRouteHandler> Options(
    const std::string &path,
    StandardRouteHandler::HandlerFunction handler,
    int priority = 0)
{
    return std::make_shared<StandardRouteHandler>(path, "OPTIONS", handler, priority);
}

/**
 * @brief 创建TRACE路由处理器的辅助函数
 * @param path 路由路径
 * @param handler 处理函数
 * @param priority 优先级
 * @return 路由处理器的智能指针
 */
CLINK_FUNCTION inline std::shared_ptr<StandardRouteHandler> Trace(
    const std::string &path,
    StandardRouteHandler::HandlerFunction handler,
    int priority = 0)
{
    return std::make_shared<StandardRouteHandler>(path, "TRACE", handler, priority);
}

} // namespace Router
} // namespace CLink

#endif // CLINK_ROUTER_STANDARDROUTEHANDLER_H